/**
 * 
 */
package util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author Christian Diese Klasse enth�lt mehere Methoden um ganze Ordnerstrukturen zu verschieben.
 */
public class KopierWerkzeug {
	
	/**
	 * 
	 * @param defaultPfad
	 * @param pfad
	 * @return
	 */
	public boolean copySavedData(String defaultPfad, String pfad) {

		return copySavedData(defaultPfad, pfad, true);
	}
	
	/**
	 * Kopiert Ordner und datein sichert aber eventuell vorhanden Dateien
	 * 
	 * @param defaultPfad
	 *            Quelle
	 * @param pfad
	 *            Ziel
	 */
	public boolean copySavedData(String defaultPfad, String pfad, boolean sichern) {

		File quelle = new File(defaultPfad);
		File ziel = new File(pfad);
		if (ziel.exists() && sichern) {
			ordnerSichern(ziel);
		}
		try {
			if (quelle.isFile()) {
				copyFile(quelle, ziel);
			} else {
				copyDir(quelle, ziel);
			}
			return true;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return false;
	}
	
	/**
	 * 
	 * @param quelle
	 *            Quellepfad
	 * @param ziel
	 *            Zielpfad
	 * @throws IOException
	 *             ex
	 */
	public void copyDir(File quelle, File ziel) throws IOException {

		File[] files = quelle.listFiles();
		ziel.mkdirs();
		for (File file : files) {
			if (file.isDirectory()) {
				copyDir(file,
						new File(ziel.getAbsolutePath() + System.getProperty("file.separator")
								+ file.getName()));
			} else {
				copyFile(file,
						new File(ziel.getAbsolutePath() + System.getProperty("file.separator")
								+ file.getName()));
			}
		}
	}
	
	/**
	 * 
	 * @param file
	 *            Quellepfad
	 * @param ziel
	 *            Zielpfad
	 * @throws IOException
	 *             ex
	 */
	public void copyFile(File file, File ziel) throws IOException {

		BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
		BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(ziel, true));
		int bytes = 0;
		while ((bytes = in.read()) != -1) {
			out.write(bytes);
		}
		in.close();
		out.close();
	}
	
	/**
	 * Der angegebene Pfad wird gesichert, indem .old angeh�ngt wird.
	 * 
	 * @param ziel
	 *            Pfad der gesichert werden soll
	 */
	public void ordnerSichern(File ziel) {

		String zielPfad = ziel.getAbsolutePath();
		while (new File(zielPfad).exists()) {
			zielPfad += ".old";
		}
		ziel.renameTo(new File(zielPfad));
	}
	
	/**
	 * @param start
	 * @param ziel
	 */
	public void moveSavedData(String start, String ziel) {

		moveSavedData(start, ziel, false);
	}
	
	public void moveSavedData(String start, String ziel, boolean delEmptyDirs) {

		boolean copyOk = copySavedData(start, ziel);
		if (copyOk) {
			deletePfad(new File(start), delEmptyDirs);
		}
	}
	
	public boolean deletePfad(File path) {

		return deletePfad(path, false);
	}
	
	public boolean deletePfad(File path, boolean delEmptyDirs) {

		boolean bool = true;
		if (path.isFile()) {
			bool = path.delete();
		} else if (path.listFiles() != null) {
			for (File file : path.listFiles()) {
				if (file.isDirectory()) {
					deletePfad(file);
				}
				bool = file.delete();
			}
			if (delEmptyDirs) {
				do {
					bool = path.delete();
					path = path.getParentFile();
				} while (bool && path != null && path.canRead() && path.list().length == 0);
			}
		}
		return bool;
	}
}
